#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行，
# 第2行注释表示.py文件本身使用标准UTF-8编码：
print("#############文件读写#############")
# 要以读文件的模式打开一个文件对象，使用Python内置的open()函数，传入文件名和标示符：
# 标示符'r'表示读，这样，我们就成功地打开了一个文件。如果文件不存在，open()函数就会抛出一个IOError的错误
try:
    f = open("utf-8.txt", 'r')
    print("f：", f)
    print(f.read())
finally:
    if f:  # 如果f不为null
        f.close()
# 省略try...finally写法
print("#############省略try...finally写法#############")
with open("utf-8.txt", 'r') as f:
    print(f.read())
# read(size)方法，每次最多读取size个字节的内容。
# 另外，调用readline()可以每次读取一行内容，
# 调用readlines()一次读取所有内容并按行返回list。
# 如果文件很小，read()一次性读取最方便；
# 如果不能确定文件大小，反复调用read(size)比较保险；
# 如果是配置文件，调用readlines()最方便
print("#############使用readlines()方法#############")
with open("utf-8.txt", 'r') as f2:
    print(f2.readlines())
    for line in f2.readlines():
        print(line.strip())  # 把末尾的'\n'删掉
# file-like Object
# 像open()函数返回的这种有个read()方法的对象，在Python中统称为file-like Object。
# 除了file外，还可以是内存的字节流，网络流，自定义流等等file-like Object不要求从特定类继承，只要写个read()方法就行。
# StringIO就是在内存中创建的file-like Object，常用作临时缓冲。
print("#############读取gbk编码的文件#############")
with open("io.txt", 'r', encoding='utf-8', errors='ignore') as file:
    print(file.read())
print("#############二进制文件，rb#############")
with open("python.jpg", 'rb') as file2:
    print(file2.read())
print("#############写文件#############")
with open("test_write.txt", 'a', encoding='utf-8') as write:
    write.write("追加")
print("#############seek()控制光标位置#############")
f = open("io.txt", 'r', encoding='utf-8')
print(f.readline(), end="")
f.seek(0)
print("f.tell()：", f.tell())
print(f.readline(), end="")
f.seek(0)
print("f.tell()：", f.tell())
print(f.readline(), end="")
f.close()
print("#############for循环文件#############")
f = open("io.txt", 'r', encoding='utf-8')
for line in f:
    print(line, end="")
f.close()
print("#############for循环文件#############")
f = open("test_write.txt", 'a', encoding='utf-8')
f.seek(0)
f.truncate()
f.close()
